cmake_minimum_required(VERSION 3.12)
project(lvgl VERSION 1.0)

set(LVGL_SDK_PATH ${PROJECT_SOURCE_DIR}/LVGL_SDK)
set(LVGL_MAIN_SOURCE ${PROJECT_SOURCE_DIR}/main/src)
#set(CMAKE_C_STANDARD 11)#C11
#set(CMAKE_CXX_STANDARD 17)#C17
#set(CMAKE_CXX_STANDARD_REQUIRED ON)

include_directories(include ${PROJECT_SOURCE_DIR} ${LVGL_SDK_PATH})      
#将指定目录添加到编译器的头文件搜索路径之下，指定的目录被解释成当前源码路径的相对路径。

#file(GLOB_RECURSE INCLUDES "lv_drivers/*.h" "lv_examples/*.h"  "lvgl/*.h"  "./*.h" )
#file(GLOB_RECURSE SOURCES  "lv_drivers/*.c" "lv_examples/*.c"  "lvgl/*.c" )
#FILE文件命令具体包括许多，在这里使用GLOB_RECURSE 
#代表把该目录的所有源文件都赋予变量SOURCE

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#指定动态库的生成路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
#指定静态库的生成路径
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/out)
#设置可执行文件的输出目录


set(CMAKE_CXX_FLAGS "-03")  #设置编译选项

#获取子模块目录
execute_process(
    COMMAND ls ${LVGL_SDK_PATH}
    OUTPUT_VARIABLE lvgl_sdk_dirs
)

string(REPLACE "\n" ";" dirs_list ${lvgl_sdk_dirs})
#string指令的作用：
#关键字REPLACE（替换）将mydirs字符串中的\n  （换行符号）替换成分号（；），使用dirs_list表示处理好的数据
#通过替换后，会组成一个没有;的字符串
#打印处理后的字符串
#message(${dirs_list})

#编译下一级的所有子模块，这里处理目录信息，使用循环的方式
foreach(item ${dirs_list})    #foreach使用列表项(item循环变量)作为循环条件IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${PROJECT_DIR}/${item} 
    if(IS_DIRECTORY ${LVGL_SDK_PATH}/${item} )#AND NOT "${item}" STREQUAL "${INCLUDE}")
    #这个if判断工程目录下的目录，并且剔除main目录
    message("item:${item}")
    #
    #编译子目录
    add_subdirectory(${LVGL_SDK_PATH}/${item})
    #
    #子目录编译之后会以目录名作为模块链接名，这里将这个模块名进行添加
    list(APPEND LIB_LIST ${item})
    endif()
endforeach()


find_package(SDL2 REQUIRED SDL2)

#找到SDL2 如果未找到，则失败
#find_package(SDL2 REQUIRED)则会产生SDL2_INCLUDE_DIR、SDL2_LIBRARY
#find_package(SDL2 REQUIRED)这一句，这一句的作用就是根据FindSDL2.cmake这个文件进行查找SDL2的头文件和源文件路径，而cmake并没有给出这个模块，这个模块是SDL wiki官方教程中给出的，链接如下：
#https://www.willusher.io/sdl2%20tutorials/2013/08/15/lesson-0-setting-up-sdl

include_directories(${SDL2_INCLUDE_DIRS})
#添加对应的头文件搜索目录
aux_source_directory(${LVGL_SDK_PATH}/../main/src src)
add_executable(main ${src})



target_link_libraries(main PRIVATE SDL2 ${LIB_LIST} lvgl_examples)
#链接对应的函数库
#这里因为examples是lvgl库下的一个新库，不能自动添加到LIB_LIST的表中，这里的库会在主函数中执行和调用
#所以这里直接添加


add_custom_target(run COMMAND ${EXECUTABLE_OUTPUT_PATH}/main)
#将可运行文件变成一个可执行的指令:将工程生成的可执行文件变成一个run的指令
#如：make run  或者 ninja run  运行这个工程的可执行文件